package com.gz.vo;

import com.gz.enums.ResultCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;

//统一返回结果的类
@Getter
@ToString
@NoArgsConstructor
public class R<T>  {
    /**
     * 状态码，比如1000代表响应成功
     */
    private Integer code;
    /**
     * 响应信息，用来说明响应情况
     */
    private String msg;
    /**
     * 响应的具体数据
     */
    private T data;

    private R(ResultCode resultCode, T data) {
        this.code = resultCode.getCode();
        this.msg = resultCode.getMsg();
        this.data = data;
    }
    private R(String msg, T data) {
        this.msg = msg;
        this.data = data;
    }

    private R(Integer code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 业务成功返回业务代码,描述和返回的参数
     */
    public static R<Void> success() {
        return new R<>(ResultCode.SUCCESS, null);
    }

    /**
     * 业务成功返回业务代码,描述和返回的参数
     */
    public static <T> R<T> success(T data) {
        return new R<>(ResultCode.SUCCESS, data);
    }
    /**
     * 业务成功返回业务代码,描述和返回的参数
     */
    public static <T> R<T> ok(T data) {
        return new R<>(ResultCode.SUCCESS, data);
    }
    /**
     * 业务成功返回业务代码,描述和返回的参数
     */
    public static <T> R<T> ok(String msg,T data) {
        return new R<>(msg, data);
    }
    /**
     * 业务成功返回业务代码,描述和返回的参数
     */
    public static <T> R<T> ok(Integer code,String msg,T data) {
        return new R<>(code,msg, data);
    }

    /**
     * 业务成功返回业务代码,描述和返回的参数
     */
    public static <T> R<T> success(ResultCode resultCode, T data) {
        if (resultCode == null) {
            return success(data);
        }
        return new R<>(resultCode, data);
    }

    /**
     * 业务异常返回业务代码和描述信息
     */
    public static <T> R<T> failure() {
        return new R<>(ResultCode.FAILED, null);
    }

    /**
     * 业务异常返回业务代码,描述和返回的参数
     */
    public static <T> R<T> failure(ResultCode resultCode) {
        return failure(resultCode, null);
    }

    /**
     * 业务异常返回业务代码,描述和返回的参数
     */
    public static <T> R<T> failure(ResultCode resultCode, T data) {
        if (resultCode == null) {
            return new R<>(ResultCode.FAILED, null);
        }
        return new R<>(resultCode, data);
    }

    /**
     * 业务异常返回业务代码,描述和返回的参数
     */
    public static <T> R<T> failure(String msg) {
        return failure(ResultCode.FAILED.getCode(), msg, null);
    }

    /**
     * 业务异常返回业务代码,描述和返回的参数
     */
    public static <T> R<T> failure(Integer code, String msg, T data) {
        if (code == null) {
            return new R<>(ResultCode.FAILED, null);
        }
        return new R<>(code, msg, data);
    }
}

